iT邦幫忙

2024 iThome 鐵人賽

DAY 25
0
Modern Web

用 Angular Material 開發應用程式系列 第 25

Day 25 - 切換應用程式樣式

  • 分享至 

  • xImage
  •  

定義淺色與深色樣式

要實作切換樣式前,我們先分別利用 Angular CLI 定義淺色與深色兩種樣式檔案。

// light-theme
$light-theme: mat.define-theme(
  (
    color: (
      theme-type: light,
      primary: $_primary,
      tertiary: $_tertiary,
    ),
  )
);

body.light-theme {
  @include mat.all-component-themes($light-theme);
}
// dark-theme
$dark-theme: mat.define-theme(
  (
    color: (
      theme-type: dark,
      primary: $_primary,
      tertiary: $_tertiary,
    ),
  )
);

body.dark-theme {
  @include mat.all-component-themes($dark-theme);
}

如上面程式,我們分別在淺色與深色樣式檔案的最後面,針對 body 加入不同樣式類別名稱的設定,以便用來切換時指定對應的樣式。接著,在 angular.json 檔案中把這兩個樣式檔案加入到 style 定義內。

https://ithelp.ithome.com.tw/upload/images/20241009/201096458tOtNkIrCq.png

另外,因為我們沒有載入 Material 預設樣式,所以還需要在 style.scss 檔案載入核心樣式,否則如彈跳視窗會無法正常顯示。

@use "@angular/material" as mat;

@include mat.core();

切換應用程式樣式

如此一來,就可以在 AppComponent 中,利用 Renderer2 服務來針對 body 標籤設定 class 屬性。

export class AppComponent implements OnInit {
  ...

  private readonly renderer = inject(Renderer2);

  private readonly themes = signal('light-theme');

  ngOnInit(): void {
    this.renderer.addClass(document.body, this.themes());
  }

  protected onToggleTheme(): void {
    const fromTheme = this.themes();
    const toTheme = fromTheme === 'light-theme' ? 'dark-theme' : 'light-theme';
    this.renderer.removeClass(document.body, fromTheme);
    this.renderer.addClass(document.body, toTheme);
    this.themes.set(toTheme);
  }

  ...
}

https://ithelp.ithome.com.tw/upload/images/20241009/20109645tzA0xOR2Wf.png

https://ithelp.ithome.com.tw/upload/images/20241009/20109645fB3bIlkPQZ.png

接下來

這幾天簡單地描述 Material 相關的樣式設定。接下來,我們來利用 Material 的工具自訂元件。


上一篇
Day 24 - 元件內調整 Angular Material 樣式
下一篇
Day 26 - 自定義表單欄位
系列文
用 Angular Material 開發應用程式30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言